{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Practical 9: Validation and Model Selection"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Upon completion of this session you should be able to:\n",
    "- understand how model evaluation and the tuning of hyperparameters work.\n",
    "- be able to apply the techniques introduced to evaludate model and select model.\n",
    "\n",
    "---\n",
    "- Materials in this module include resources collected from various open-source online repositories.\n",
    "- Jupyter source file can be downloaded from https://github.com/gaoshangdeakin/SIT384-Jupyter\n",
    "- If you found any issue/bug for this document, please submit an issue at [https://github.com/gaoshangdeakin/SIT384/issues](https://github.com/gaoshangdeakin/SIT384/issues)\n",
    "\n",
    "\n",
    "---\n",
    "\n",
    "In this practical session, we'll look at *model evaluation* and the tuning of *hyperparameters*, which are parameters that define the model.\n",
    "\n",
    "\n",
    "\n",
    "## Background\n",
    "\n",
    "\n",
    "### Part 1 [Validating Models](#1) \n",
    "\n",
    "\n",
    "### Part 2 [Validation Sets](#2) \n",
    "\n",
    "\n",
    "### Part 3 [Cross-Validation](#3)\n",
    "\n",
    "### Part 4 [Overfitting, Underfitting and Model Selection](#4)\n",
    "\n",
    "\n",
    "## Tasks\n",
    "\n",
    "## Summary"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id = \"1\"></a>\n",
    "\n",
    "## Validating Models\n",
    "\n",
    "One of the most important pieces of machine learning is **model validation**: that is, checking how well your model fits a given dataset. But there are some pitfalls you need to watch out for.\n",
    "\n",
    "Consider the digits example we've been looking at previously. How might we check how well our model fits the data?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import print_function, division\n",
    "\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Use seaborn for plotting defaults\n",
    "import seaborn as sns; sns.set()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_digits\n",
    "digits = load_digits()\n",
    "X = digits.data\n",
    "y = digits.target"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's fit a K-neighbors classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=None, n_neighbors=1, p=2,\n",
       "           weights='uniform')"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "knn = KNeighborsClassifier(n_neighbors=1)\n",
    "knn.fit(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we'll use this classifier to *predict* labels for the data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred = knn.predict(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, we can check how well our prediction did:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1797 / 1797 correct\n"
     ]
    }
   ],
   "source": [
    "print(\"{0} / {1} correct\".format(np.sum(y == y_pred), len(y)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It seems we have a perfect classifier!\n",
    "\n",
    "**Question: what's wrong with this?**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id = \"2\"></a>\n",
    "\n",
    "## Validation Sets\n",
    "\n",
    "Above we made the mistake of testing our data on the same set of data that was used for training. **This is not generally a good idea**. If we optimize our estimator this way, we will tend to **over-fit** the data: that is, we learn the noise.\n",
    "\n",
    "A better way to test a model is to use a hold-out set which doesn't enter the training. We've seen this before using scikit-learn's train/test split utility:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1347, 64), (450, 64))"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y)\n",
    "X_train.shape, X_test.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we train on the training data, and validate on the test data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "442 / 450 correct\n"
     ]
    }
   ],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1)\n",
    "knn.fit(X_train, y_train)\n",
    "y_pred = knn.predict(X_test)\n",
    "print(\"{0} / {1} correct\".format(np.sum(y_test == y_pred), len(y_test)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This gives us a more reliable estimate of how our model is doing.\n",
    "\n",
    "The metric we're using here, comparing the number of matches to the total number of samples, is known as the **accuracy score**, and can be computed using the following routine:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9822222222222222"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "accuracy_score(y_test, y_pred)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This can also be computed directly from the ``model.score`` method:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9822222222222222"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.score(X_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Using this, we can ask how this changes as we change the model parameters, in this case the number of neighbors:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 0.9822222222222222\n",
      "5 0.9822222222222222\n",
      "10 0.9755555555555555\n",
      "20 0.9711111111111111\n",
      "30 0.9577777777777777\n"
     ]
    }
   ],
   "source": [
    "for n_neighbors in [1, 5, 10, 20, 30]:\n",
    "    knn = KNeighborsClassifier(n_neighbors)\n",
    "    knn.fit(X_train, y_train)\n",
    "    print(n_neighbors, knn.score(X_test, y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We see that in this case, a small number of neighbors seems to be the best option."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id = \"3\"></a>\n",
    "\n",
    "## Cross-Validation\n",
    "\n",
    "One problem with validation sets is that you \"lose\" some of the data. Above, we've only used 3/4 of the data for the training, and used 1/4 for the validation. Another option is to use **2-fold cross-validation**, where we split the sample in half and perform the validation twice:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((898, 64), (899, 64))"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X1, X2, y1, y2 = train_test_split(X, y, test_size=0.5, random_state=0)\n",
    "X1.shape, X2.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9832962138084632\n",
      "0.982202447163515\n"
     ]
    }
   ],
   "source": [
    "print(KNeighborsClassifier(1).fit(X2, y2).score(X1, y1))\n",
    "print(KNeighborsClassifier(1).fit(X1, y1).score(X2, y2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Thus a two-fold cross-validation gives us two estimates of the score for that parameter.\n",
    "\n",
    "Because this is a bit of a pain to do by hand, scikit-learn has a utility routine to help:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9604878508006977"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "cv = cross_val_score(KNeighborsClassifier(1), X, y, cv=2)\n",
    "cv.mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### K-fold Cross-Validation\n",
    "\n",
    "Here we've used 2-fold cross-validation. This is just one specialization of $K$-fold cross-validation, where we split the data into $K$ chunks and perform $K$ fits, where each chunk gets a turn as the validation set.\n",
    "We can do this by changing the ``cv`` （**c**ross **v**alidation) parameter above. Let's do 10-fold cross-validation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.93513514, 0.99453552, 0.97237569, 0.98888889, 0.96089385,\n",
       "       0.98882682, 0.99441341, 0.98876404, 0.97175141, 0.96590909])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross_val_score(KNeighborsClassifier(1), X, y, cv=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This gives us an even better idea of how well our model is doing."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id = \"4\"></a>\n",
    "\n",
    "## Overfitting, Underfitting and Model Selection"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that we've gone over the basics of validation, and cross-validation, it's time to go into even more depth regarding model selection.\n",
    "\n",
    "The issues associated with validation and \n",
    "cross-validation are some of the most important\n",
    "aspects of the practice of machine learning.  Selecting the optimal model\n",
    "for your data is vital, and is a piece of the problem that is not often\n",
    "appreciated by machine learning practitioners.\n",
    "\n",
    "Of core importance is the following question:\n",
    "\n",
    "**If our estimator is underperforming, how should we move forward?**\n",
    "\n",
    "- Use simpler or more complicated model?\n",
    "- Add more features to each observed data point?\n",
    "- Add more training samples?\n",
    "\n",
    "The answer is often counter-intuitive.  In particular, **Sometimes using a\n",
    "more complicated model will give _worse_ results.**  Also, **Sometimes adding\n",
    "training data will not improve your results.**  The ability to determine\n",
    "what steps will improve your model is what separates the successful machine\n",
    "learning practitioners from the unsuccessful."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Illustration of the Bias-Variance Tradeoff\n",
    "\n",
    "For this section, we'll work with a simple 1D regression problem.  This will help us to\n",
    "easily visualize the data and the model, and the results generalize easily to  higher-dimensional\n",
    "datasets.  We'll explore a simple **linear regression** problem.\n",
    "This can be accomplished within scikit-learn with the `sklearn.linear_model` module.\n",
    "\n",
    "We'll create a simple nonlinear function that we'd like to fit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "def test_func(x, err=0.5):\n",
    "    y = 10 - 1. / (x + 0.1)\n",
    "    if err > 0:\n",
    "        y = np.random.normal(y, err)\n",
    "    return y"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's create a realization of this dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "def make_data(N=40, error=1.0, random_seed=1):\n",
    "    # randomly sample the data\n",
    "    np.random.seed(1)\n",
    "    X = np.random.random(N)[:, np.newaxis]\n",
    "    y = test_func(X.ravel(), error)\n",
    "    \n",
    "    return X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X, y = make_data(40, error=1)\n",
    "plt.scatter(X.ravel(), y);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now say we want to perform a regression on this data.  Let's use the built-in linear regression function to compute a fit:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X_test = np.linspace(-0.1, 1.1, 500)[:, None]\n",
    "\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.metrics import mean_squared_error\n",
    "model = LinearRegression()\n",
    "model.fit(X, y)\n",
    "y_test = model.predict(X_test)\n",
    "\n",
    "plt.scatter(X.ravel(), y)\n",
    "plt.plot(X_test.ravel(), y_test)\n",
    "plt.title(\"mean squared error: {0:.3g}\".format(mean_squared_error(model.predict(X), y)));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We have fit a straight line to the data, but clearly this model is not a good choice.  We say that this model is **biased**, or that it **under-fits** the data.\n",
    "\n",
    "Let's try to improve this by creating a more complicated model.  We can do this by adding degrees of freedom, and computing a polynomial regression over the inputs. Scikit-learn makes this easy with the ``PolynomialFeatures`` preprocessor, which can be pipelined with a linear regression.\n",
    "\n",
    "Let's make a convenience routine to do this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.pipeline import make_pipeline\n",
    "\n",
    "def PolynomialRegression(degree=2, **kwargs):\n",
    "    return make_pipeline(PolynomialFeatures(degree),\n",
    "                         LinearRegression(**kwargs))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we'll use this to fit a quadratic curve to the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = PolynomialRegression(2)\n",
    "model.fit(X, y)\n",
    "y_test = model.predict(X_test)\n",
    "\n",
    "plt.scatter(X.ravel(), y)\n",
    "plt.plot(X_test.ravel(), y_test)\n",
    "plt.title(\"mean squared error: {0:.3g}\".format(mean_squared_error(model.predict(X), y)));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This reduces the mean squared error, and makes a much better fit.  What happens if we use an even higher-degree polynomial?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEJCAYAAABxIVf8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xecm1eZ6PHfK2l688x47HHvPrbHNU7BOMXpCQmpJLQA2WzCAgl1yV72Atu4cMOGu4HABliWNAgBUsiGJDYhzbEdO801Y/vYHtfxeOxpnt5U7h+vNNZopFEdtff5fj7Jx5JeSeeMpEePnnPecwyPx4MQQojsZEt1A4QQQowdCfJCCJHFJMgLIUQWkyAvhBBZTIK8EEJkMQnyQgiRxRypboAQ6UwpdTbwtNZ6ZqrbEkgpNQ/4NTAe6AI+q7XeG+S4i4H7gRygF/iK1vodpdS3gE/4HVoFlGitS5VSduC7wHVAEfAS8A2ttcy5zjCSyQuRuZ4AfqG1XgT8M/C0UsrwP0AplQv8AbhLa70M+D/AbwC01vdprZdrrZcDa4Bu4OPeu37Ve91qYCmwyu82kUEkk7copdQa4P8CRwGF+QG/D/iK9/IzWuuve4/9KPAdIBfoAb6ptd6slJoI/BKYCFQDR4BbtdanlFKHgUeBS4HpwONa6+8GaccXgS8AA0Af8Hda691KqQuBBwEPsAW4GjPozAR+prVe7NePn2mtF0fQnrcxA9b/Bt4BfuZtWw7we631D/za9HWgHdg1yt/ww8APMTNdF/CvWusXlFK3A3/rvb4deMz/stb6YqXUd4FPAk5gH3CP1rpRKfUG0AosAH7u7cMXtNYfCXjuKd5jfg+gtV6rlPo5sALY6jtOaz2glJqitR70fgHMBlqCdOdHwFqt9Vrv5c9ivs693ue7GfM1EhlGMnlrOwe4z5vJdQD/CFwDnAXcrZSa7C0J/AD4iNZ6BfB54FmlVBHmT/3NWutVmMGjB/iM3+MXa60vAD4MfFMpNcv/yb0lgR8DV2mtzwH+Czjfm30+jRlkVgAbgRkR9Cdcez7QWi/UWv8JM5t9WGu9EjgXuEwpdatSajnwL8CF3jYFDWxKqXLgEeAzWuuzgOuBnyulpnsPqQHWaK0vDryslPobzC+tc7TWS4EPML8Qfdq01ou01j/VWj8fGOC9pgENWmu333X1wNTAA70BfqL39vuBfw/oyyLgBuCf/K6eDyxSSr2qlNoJfBHzy0dkGAny1nZIa73N++864HWt9YDWuhkz6FcAlwOTgFeVUtsxSwRuYK7W+ifAW0qpbwAPAYuBYr/H/x8ArfVx4JT38YZorV3AU97H+BlwGrPGvBTo11q/4j3uCe9to4qgPRsAvF9QFwHf8/ZpC2ZGvxzzl8fLWutG733+K8TTrfL+XZ7zPsZLmL86lnpv36m17vA73v/y1cAjWutu7+WfAJd6v9yG2hmGzft8/gzMXxQjaK1Paq2neNv9iFJqvt/NX8P8NdTud10O8CHgI5glm/OBL0fQLpFmpFxjbf0BlweDHGMHXtVaD9VjlVLTgAal1A8xs+CHgdcxA4N/TbjX79+egNsA0FrfppRaDFwGfAsz8/7XIMf62hb4OL7ASATt6fLrkwF8WGvd473veLzlooD7OAPb7PcYe7TW5/k9/2SgCfi033MFPrfvvv4B2ob5WTSCHBvKUWCSUsrwGwydjJmtD1FKlQGXeH+9oLXeqpTaASwB9nl/Td0MrAx4/AbgSa11P9CvlHoKuBDzl5fIIJLJi3BeBa5QSi0AUEp9BNgJFABXAj/WWv8GM1O/HDOARUQpNV4pdQxo0Vr/GLPufw6ggV7vWIDvOau8d2sCpiulJnhrzP6zQyJqjzej3gJ8w/v444BNmCWXl7399ZU9bg/R/C3APO/YAd4yz35gSgRdXwfc4f1FAeY4yJvegBoRrXU9cADvYKhS6krMX1iBYwgu4GGl1GrvcTWYtfy3vbcvwSwPHQ6439PAbUopm1IqB7gWeDfS9on0IUFejEprvRuzDv97bwb4PeA6rXUX8G/Aj7w12+cxa+dzo3jsZszZHq8qpd7HHPi9S2vtBG4C/kEptQ0zkPf5teeXwHuYgfaQ30NG055PAR9SSu3CDHhPaq2f0FrvAv7B26b3gPwQbW/CzIDv9/5dfoNZnz8cQdd/DbwCvKOU2oM5BvLpYAcqpa5TSr0U4nE+CXxBKfUB8H3gFl+NXim1XSl1tvd1ugH4sbes9DDwKe+XBMA8IFibvwOcxBwvqAUOIll8RjJkqWGRCZRSXcDiCIOoEMJLMnkhhMhiEWfySqlS4C3gWv9sSil1D/AxrfWasWigEEKI2EWUySulzsOsb84PuH4R5owIIYQQaSjScs1dwN2Y06oAUErlYQ6A/VOoOwkhhEitiObJa63vBFBK+V/9fzFH6g8Fu88o8jCnyZ0gxIkbQgghRrBjnoD3LiPPcQkpppOhlFKXA9O11t/wrh0SjXOI7Iw+IYQQI12AWT6PSKxnvH4SqPHOuy0GqpVSf/A/K3IUJwDa2rpxu9Nr+ua6t4/yxrbj3PeFVVRWFtPSEsmJh+kvW/qSLf0A6Us0fvXnWgacHu6+cXHU9/32f2/hw4smMX96Gb/6826+eMNiZk0qDXl8Or8uNptBeXkReGNopGIK8lrrO3z/9mby/xJhgAdvicbt9qRdkO/qHeBkW89Qu9KtffHIlr5kSz9A+hKp5tN9eGJ8jqa2Xjp6+ukfcHGqrZf+AVfYx8mA1yWqMrfMk/djYIxc8kkIkVIujwe7bcSyRxExRi6XZDlRZfLBdsfRWr+Buc53xjMkxguRdlwuD/k5sQdrq5/UL5l8ELLUgxDpw+2OPZOXRF6C/DCGYb4jJMQLkT5cbje2WIO8kCDvz/C9jyTKC5E2XG4Pdnt8ocrKH2kJ8n58Md4t5Roh0oYrjnKN5P8S5Icz5C0hRLpxuz3Y4vhsWj1nkyDvZ6haY/E3hRDpxCzXxJjJS94mQd7fmTeERHkh0kU85RohQX4Y3+ya9D/hTQjriGsKJeCxeNImQd6PJPJCpJ/4plDKLwAJ8v687werf/MLkU5cbg8OWxyhyoOlEzcJ8n5861zIwKsQ6cPl8sScyQfey4oDsRLk/fjeABLkhUgf8dbkrU6CvJ8zbyOJ8kKkA7fbLJ7GN/BqbRLk/cnaNUKkFZd3qlvM5Rr5ASBB3p+Ua4RIL74NPGI9GQqwfNYW8XrySqlS4C3gWq31YaXU54GvYP4J3wP+Tms9MDbNTI4zZ7xa/F0hRJpwud0A2CUlj1lEmbxS6jzMjWPney/PB+4FPgws9T7O3WPUxqSRpYaFSC/OOMs1YE6JtvK06EjLNXdhBvEG7+V+4Eta6w6ttQfYBUwfg/YllSw1LER6cbnMD6PDEVtl2Qj4BWDF7QAjKtdore8EUEr5Lh8BjnivqwLuAW4fkxYm0VAmL+UaIdKC02WWa3LiXE/eyqLa4zWQUmoKsBb4tXev14hVVhbH89RjorQkH4DyiiIAqqpKUtmchMqWvmRLP0D6Eok+M8ZTPq4wpucwDIP8/BzKygoBGBfB42TT6wJxBHml1ALgL8CDWuv/F+39W1q6hkbO00V3dz8Azc1dVJYV0NTUmeIWJUZVVUlW9CVb+gHSl0g1NXcB0NvTH9NzeDweevsGaW/vAeD06R6amnJCHp/Or4vNZsSUHMcU5JVSJcDLwLe11r+J5THSkawnL8TY6x9w8eAzOzne1MXXb13OjOrQmbOvXBPX9n8W/zzH+pe7E5gI/L1Sarv3v39LYLtSQmry1tHRPUDfgDPVzbCkFzYfZs+RNjp6Bnnir/tGPXbQGV9NXmZeRpnJa61nev/5gPe/rOJ7Q7hT2wwxhk6d7uXXL+xmf307NsPgwmWT+MSl88jNsae6aZYw6HTzxrbjrFRVzJ5cylOv19HY2kN1RWHQ413eTN4Rz8lQYOlsXoas/dgkk89qHT0D/OjJbTQ0d3PzRbO5aMVk3tjewM+e3TV00o0YWx8cbKG7z8mFyyZzjpoAQO2h1pDHD/qmUMZRrhn2abZgZh/X7JpsI8saZC+Px8Mv/6eW9u4BvvXps5g1qRSAaROKeXyd5q/v1nPVeRl/qkfa21HXTEGenYUzyrHbDMpL8thff5pLV04NevyZTD7Gck3MLc0eksn7kZp89tq6r4k9R9r4+CVzhwI8wEXLJrNi3nj+tOEgJ9t6UtjC7OfxeNh1sJVFMytw2G0YhsG8qWUcON4e8j6DiSjXWPzzLEHez1BN3trviazjcrt5+o06JlUWctHyycNuMwyDz1ypMAx4fuOhFLXQGlo7+mnr7GfB9PKh66ZNKKa1o5+evuCD4PGe8SojrxLkhzGkXpOVtu1r5mRbLzddOAd7kG3kxhXnccmKqWzZfZKTrZLNj5X9x08DMHdK2dB1U8ab874bWrqD3mcok49n+z+Lk7+cH5knn51efb+e8WX5rJg3PuQxV543HYfdxrp3jiaxZdZSV99BXo6dqROKhq6bUmX++3hTV9D7+ObJx5zJY+mJNYAMvA7jy+TdEuWzRn1TF/rYaW65eM6oKxmWFeVy3sKJbKk9ya0Xz6UgLzM/GptrG3l2fR0tHf1UluZx00VzWFVTnepmAXDgeDuzJ5cO+zVVWZZPjsPGiZbgv6CcQ7Nr4tvj1cqfaMnk/dikWpN1Nn/QiN1mcP6SSWGPXbNiCv2DLrbsPpmEliXe5tpGHlu7l5YOc3mOlo5+Hlu7l821jSluGfQNODl2qos5fqUaMKctjy/Lp+l0b9D7OeOcXQPDP89WrNBLkPdzZj15ifLZwO3x8PaekyyeVUFJYW7Y42dNKmH6hGLe3N4Q9th09Oz6Ogacw+f7DzjdPLu+LkUtOuNQQwduj4d5U8tG3DZhXAFNp/uC3s8Z7+waK0b1ABLk/ci4a3Y5UN9Oa0c/5y2aGNHxhmGwanE1R0520piBA7C+DD7S65Np//F2DGDO5NIRt1WNK6DpdG/QqctOlxvDIOiAuYiM/OX8SE0+u7y75xS5DhvLRxlwDXTOAvMszHf2ZF7JprI0L6rrk+nA8XYmjy+iMH/kCpBV5QX0D7ro7BkccZvT5UnAWvLW/jxLkPcjNfns4fF42H6giUUzK8jPjXwQtaI0n/lTy3h798mMOynupovmkBswCyXXYeOmi+akqEUmt8fDoYYO5kwZmcUDVHj3cWjrHPmLw+l0x7UCpVRrJMgPI2e8Zo/jTd20dPRHlcX7nLtoIidaejjeFHzudrpaVVPN565eMJS5V5bm8bmrF6R8ds3J1h66+5zMmTyyHg9QXmK2t7VzZF3e6XKTE+fiZFb/OGfmPLExIjX57LH9QDMAS+dURn3fs9UEnvjrPt7ec5KpE9JvB7PRrKqpTnlQD1R3vAOA2VNGD/Kng2XyLk98mfxQ4hbzQ2Q8yeT9SCafPXYcaGZmdQnjiqOvR5cW5aKmjWP7/uYxaJm1bK5t5Im/agAe+MO2oNM5y4pysRkGrUGDvDvumrzVV6GUIO/HJmvXZIWO7gEONnSwfG70pRqf5fOqON7czSlZtCxmvnn7/YPmNMjWzoGg8/ZtNoOy4twQmbwbe7xryVtcxEFeKVWqlPpAKTXTe/kypdROpdR+pdT/GbMWpoBk8plt18EWPMDSudGXanyWe++7/UBLglplPdHM2y8vyaOtK3i5Jv7ZNdYW0V9PKXUesBGY771cADwMXA8sBM5RSl09Vo1MFqnfZYfdh9soLshh+sTQe4eGM6G8kCnji9i+vymBLbOWaObtl5fkBZ1d0z/oinnXrs21jbR39bNx5wl+/UJtTI+RDSL9irwLuBvwnQp4LrBfa31Ia+0EfgvcMgbtSyqbnPGa8TweD3uOtLJwRvnQ6xmr5fPGs+9YO919I+dvi/CimbdfXhw8yA84XeTmRJ/J+0pFvtJrZ6+5lPEHB633yyyi2TVa6zsBlFK+qyYDJ/wOOQEE39olhMrK9Ju10OI9GaO0tACAqqrYM8F0ky19CdePYyc7Od01wHlLJsXd5zXnTOfFzUc43NTDmrOientHJFteEwjel9uvreE/ntw67JdxXo6d26+tGXH81OpS+t6vp6gkf9gJUx6PQUlRXtR/q+c2bh5RKgJYv+MEd964LOq+ZLJYp1DaGD5obRDl/tctLV2402yEs927SNLp0+ZgW1NTZyqbkzBVVSVZ0ZdI+rFpWz0AUysL4+5zeYGD0sIcNmw9Rs204NP/YpUtrwmE7ouaUorNMMjJsdE34BpaFbNm+rgRx+d6k/X9h1qYPP7MUsTdfYOMd+dF/bdqagu+4Nnpzv5RHyudXxebzYgpOY41yNcD/sv6VXOmlJOxZGeozLf7cCvjy/KZMK4g7seyGQbL5o7nPX0Kp8sd10qIVlR3vB2X28MXr13EWfOrRj3WN1e+rbN/KMhvrm2kqa2Hk6091B3fFNWyyZWleUFr/6VFI5dVyHaxvmvfBpRSaq5Syg58ClibuGalhk3myWc0t9uDPnqahTPKwx8coeVzx9Pb72LfsdMJe0yr2HOkDcOABdPHhT12nO+EKO8Mm8CaerTLJgdb4gHg4hWJL7ulu5gyea11n1LqduAZIB94CXg6ge1KCTnjNbMdOdlJT7+TRTMrEvaYvk2ntx9oTujjxiudNwfxqT3cyoyJJUEXJQs0rmh4kB9t+mUk/fQd8+sXduP2QEmBg85eJ0tmxz6tNlNFFeS11jP9/v0qMPoIRoaRM14z2+7DrQAJzeTzcu0smlk+dAbtn948mPLA6styfUHQl+UCaRPoWzv6qDvewY0Xzo7o+LxcOwV5Dk53DQCJWTZ5VU01z64/iJo+jnMXTuDHT+2M+L7ZRIqMfiSTz2y7D7cxtaqI0qLwG4REY9mcSppO96XNrkvpvDmIz3t7TwFnlm6OxLji3KFMPlHLJsc5izYrSJD3I+vJZ65Bp4sDx9tZOCPxJZVl3uURBl3D3xepCqzpvDmIz7t7TzF9QjHVFYUR38cwzDWH7rjvNfoGnASOc6fDssmZSIK8H1lPPnMdqG9n0Olm0czElWp8KkrzQ96WisAaKputKEnsL5hY1Td1UdfQEfGOXAC/+cteGpp7hjbu7u5z4fH7sRLPsskej7U/07LUsB+pyWeu3UfasNsM5k8LP5MjFgW5dnoHXCOuT8WuS1ecO50/vLp/xFTfQaeHr/7kTTp7nSkdM1i75Qi5DhsXLJsc0fGbaxt5fdvIGdi+GP/56xbxoUWJ6YcVyzcS5P1ITT5zBM4usdkMZk0qpSBvbN7SV5w7jf/ZeHjYdakoH2zb38RzGw6BYZDnMOgfdFNamMOE8gIOeNdth+QMxvpeg9aOfiq8XypVZQVsqT3JVedNp7ggsjnp4UpeuY7Y1q45w9ofaAnyfnxf8lKTT2/BZpcATK0au6UyPrp6Fi+/ewyXy8OA052STPnNHQ08tnYv06tL+OL1NUwoP1PvvvehTSOOj2bKYSR2H25l8weNNLT00N03SPPp3mHz2B95aQ+5DjuVZflc++GZET9uuJJXLGvX+Fgxcw8kQd6PIe+IjBBsdgmYZ1iOFZthsFJN4H3dxH99/cKkn/26ubaRR9fuZcnsSu6+cfGIlRnHcjC2q3eQR17aw7b9zRTmOZg1uZRjpzpHlIucLg9ut5N/vO2sqH5RhTo71SfeTN7qKZsMvPo5s6yB1d8W6S1UQOjoGdvVIpfNGU9vv5P99WP3ZRLMgfp2HnlpD2raOO65aUnQpXeLC4IHVYfdYDDIF2Kkmk738v3H32PXwVZuWTOHB758Pn//8eVDA6SB3B6YEuUvqlBnpy6eZQ6i58W41DCAYcWtoAJIkPdjk/XkM8Jog51jOW+9ZlY5DrvBjgPJ2xbwdFc/P312JxWl+dx90xJyggTDzbWN9PY5R1xvM8zs+lcv7I4pcWnr7Of+J7fR1TvIvZ9cztUfmjH0/Imaxw5nNiAvzDvTt+ICB5Vl5vpDBflScIiHBHk/MrsmM4w22DmW89bzcx0snFHB1n1NSXmPeDweHl+n6Rtw8ZWbl4YcyHx2fR3BEuuCPDu3XjyX9/ae4slX9o/a5s21jdz70CbuuO817n1oE69tredHvzcD/Dc+vpx5U4fPWgqWfcc7EO30m7zU1etk405zNfPCeAfTPdYu2UiQ9yOza+IXGCzGIrMebSBxrOetn72giub2Pg43jv1ytG990Mj2A83cfOHsYcvvBgrV5+4+F1edN50rzpnGq+/Xs/bto0GP8w1k+5/N+8TL+zjV1stXP7aUWZNKR9zHl31XluZhEN88dgg+zuLyFv0L8uKoyRvQ1N7LIy/uBuDBp3ek5CzlVJLfQX6yKZP3n2JYVV7ADefPGvOZIMlcUyXUYN1Yz1tfMa+Kx22ad/eeChr8EqWts5/fvbKfeVPLuOzsaaMeG+5vceslc2nvHuDpN+ooLsjhwoD568ECrAcozHegpoc+uWxVTTWraqoTsgb7aF/OdlvsuWjfgGvYLKD27sG0W+dnrEkm7ydb1pMPzMya2nqTss5KMtdUuemiOeTYhw+qJWPeenFBDgtnlvPe3lNjlgx4PB4eW7cXl8vNHdcsxGYbffAwXOnEZhj87TULWTyrgkfX7uWlLUeGtT1UgO0c44Fsf6G+nMN0Payu3sERn+d0W+dnrEmQ95Mt68mnagGrZK6psqqmethc7HjLBdE4R00Y05LNxl0n2FnXws1r5jCxPPzaL/6lEwj+t3DYbXz55qWcs2ACT79Rx3/8cQd1De24PZ6QyyEk82zeYF9UhnFmnflYhdp9Lp3W+RlrUq7xky01+VQtYJXsEoovw33gntWUFScvIK2YX8Xjf9G8vftkwks2rR19/P7V/cyfNo5LV0a+wYWvdDKa9/Qp6o6bm5/sPtRK7aFWHHYj6HTIZJ/N62v7Ey9revpdlBfnkp/noKQwvvV4bDYjaKBPxXIUqRJXJq+Uuk0pVev970eJalSq+ObUZnomn8jpbdEYixkXo9m+31zjPZkBHsySzdI5lWypbcTpin0OeiCPx8Oja/fidmOWaRJ4cp6vhNfaaa7X7gHsNoNFMyu48cLZXPvhGUMZfTJ/FflbVVPN7VcvBOArH1uGw26Le2ZNSUHOiJKP1VazjPkvqJQqBB4E5gOngU1Kqcu01q8kqnHJli01+ZsumjNsABSS88b2BYVk7FjU3tXPwYYOrr9gVsIfOxIXLJvMtv3N7KxrCbt/aaQ27DzBB4daue2K+VHvURtup6hQs1eON3XxtVvMvX9uujD1ga/K2++m07309DmZNiG+IJ+f56CyLJ+mth46e52UFeVw6yXzLDPoCvGVa+yYvwSKgG4gBwi+RXqGGKrJZ/is2sBgm6zZNb7nTsbzPLvhIB7guQ2H2LCjIenryCyZXUFZcS4bdjQkJMg3t/fy+1f3s3BGOWtWTInqvpHMasqENegBJpSbQf5kWw/t3QOUxlmuMYDxZflcu2omDz6zk6/esoyZ1WM3KyodxRzktdadSqnvAnuBHmA98Fak96+sHLvFpGLVN2CeNVhYaP78r6oqSWVz4nLdmhKuWzMvqc/5xvvHeHztHprbehlfXsDNa+ZyuLGT2oPN5Oc6WHPWVD6yelZc675UVZXwxvvH2OQ9UQbMQPX4Ok1pST5rVo4+3TCRLj93Bs++vh9b7pmzM6Phe395PB5+8sxODAP+/razmRjFRhsAz23cHHSg/bmNh4beA1XlBTS1jczBqsoLEvI+T+Rnpaw4l8Mnu3C63MyeNi6ux7bbbeTl5VDmfX3KxxWFfbxM/twHE0+5ZilwBzADaAd+C3wTuD+S+7e0dIUc+U6VQe8pd11dfQBxz/1NF4mYxxxOYDbZ1NbLL/60C7vNYMnsSjp6BvjV/3zAus2H+dotyyiPYdaErx+P/PmDESW1/kEXj75QS830sVlPPpiVcyt5+rX9PPvqPm64ILK9TH38X5PXttazY38zn71SYXO5on6tggVv3/W+x7rh/FlBS3g3nD8r7vdGot9f48vy2erdPjDfYcT12C6Xm76+Qdrbzb9R2+lumvJDn1yVjM9KrGw2I6bkOJ5yzZXAq1rrUwBKqUeBLxFhkE9HhqxdE7NQK0MWFzj4yseW4vF42La/mV/9eTf3PfE+/3jbSsbFOGDqGzwMlKzSg3/9O8dh4y/vHKOyNJ/nNx2KeiziREs3f3ztAItnVXDR8sg22QgUyaymZI6XxGtWdSl13rXxox2bCCQLy8YX5HcA/66UKsIs13wUeDchrUqRM1MoJcpHK1SAbe82T6gxDIOz5lfxzU8u5/4nt/HTZ3bxvz61IuiKiuHkOmxBv1CSMS0u8BeLb4XHx9btHba2eiRnVTpdbv7r+d3k5ti545qFMS91HelAe7LGS+K1YEY5r7xfD4y+9WKkrP5pjrk4qrV+GXgSeB/YiTnwel+C2pUSksnHLtJpm3Mml3HXtTUcOtHBH14/EPXzdPcN4nR7UjYtLtQvlljOqvzThoMcOdnJ7VcviPlXDUR2MlQmWTijnEUzy7nr2kVJX7c/G8U1P0lr/UPghwlqS8rJzlCxu+miOTz60h4G/U6sCRZ4faUOgNe3HifHYeMTl0Q+QPzunlO43R7OVuPZuq8Zt8c89X31kuRkqdGUhEY7dtPOBtZuOcqFyyYnZHZOpmTpkSjIc/DNT6xI6GNm+oy5eMgZr34MwzwdSmJ89FbVVPO+bmLrviaAoDXfwFIHwMvvHKNqXAGXnhX67E7/GrjdZlCU72DHgZah7NntgU27Gpk7ddyYB7pwuxgFHhvMkcZOHnhyK3Mml/Lpy5M7A8qS/D7QVtxERIJ8AMMwLP2tH6vefid7jrSxYt54vnzz0qDHhCp1/PG1A1yyYkrQmnTgF4PL7aE7yAYZid7PNJRg9W+7ARjgf/JrqPJRQ3M3Dzy1g5KCHO65aQk5cW9SLUYjW3rKAmUjGIZk8rHYsvskvf1Orlk1M+QxoTLgQaebV96rD3pbqC+GaB4/kYLVv++4dhF3XLOIEu8WfDkOG5++Yv6ILxx9tI0f/m4rAP/2dx9O+nIMVmX1j7Nk8gEMw5CafAzWbz/OtAnFzJoU+kSSUKW6W1hVAAAbkUlEQVSOHIeNp944wPxp45hRPfz+0QTuZC06Far+vaqmmvXbj/PYOs3L7xyjuCCH2ZPLaOvs483tDazf0cDE8kK+fPMSpk1M3/nY2UTyeAnyI9gkk4/a4cYOjp7s4tOXzx/153GoqX4fv3QuL7x1hJ89u4vvfO5syorOnMoeaQ08XRadumj5FCpL83lk7V5++syuoevtNoNLzprKTRfOpiDe7exEdCz+eZZ3WwDDMGSefJTe3N5ArsPGqpqJox432gk5syaVct8TW3ngD9v52q3LhqYU3njhbB5+cc+wKYq5Dhurl1Szs64lLU/sWTy7kh9+YRV7jrTRfLqXgnwHi2ZWxL0Oi4iBpPIS5ANJTT46fQNOtuw+ydkLJlCYH3yjaX+hSh0zq0u558Yl/OefPuB7j73HR1fPZOr4Yj441IrbAwW5dvoGXFSkWUAPxWG3sWR2ZaqbIXws/JmWIB/AMGSefDTe3XOKvgHXiH1DY7F4diXf+vRZPLZuL4+v04BZ5rhu9UyuO38WEyeUSh1bRM3qn2YJ8gEMDHlXROHNHQ1Mqixk3tSyhDzejOoSvvu5sznc2El79wCzJpUOq9ELEQ2p1kiQH0HKNZGrb+qirqGDDy2ayD/8/K2E1ccNw0j4tnrCuqw+xiZBPoBhGLizJJXv6RukvXuA8oqiMXn8N7c3YLMZvK9PDS1nEOniXEIkh+TyEuQDZMMUyoFBF0++up8NO07g9ngoKczhhgtmc3GUOw6Fe47NtY04bEbQDSuScfapECI8CfIBMn0KZd+Ak/uf3MahE51cetZUZk4q4b19TfzmL5rGlh4+cenchJzq/b5uCrq8gE+6bSsnhFVJkA9g1uQzM8h7PB4efnEPhxs7ufvGJaxU5uqGH10zj5/9fit/fe8YlWX5XHFO/Fvkrd/RwIRxBThdrqCbeCTr7FMhRjO0R0Rqm5FSsnZNAHNZg1S3IjYbdp7gPd3Ex9bMGQrwYE5D/MRl8zhrfhV/fO0AdQ3tcT3PiZZu9h07zYXLJ3PzmrnkOoa/jdLl7FMhYHj51YrrlcUV5JVSH1VKvaeU2qOU+kmiGpVKtgzN5Dt6Bnjq9QPMn1rGVedOH3G7zTD422sWUlacy2Nr9+J0RbboVzAbdpzAbjNYvWRS1m1YIbKLBWP6CPFs5D0b+AVwHnASeE0pdbXWem2iGpcKZk0+1a2I3vMbD9E34OIzVy0IWXMvyHNw2xXz+ekzu1j79lE++uGZUT/PwKCLDTsbWDFv/ND89WzasEKIbBNPJn8j8Aetdb3WehD4OPB2YpqVOplYk29p7+PNHQ2cv3QSU8aPPl1yxbwqzl4wgT9vOszJtp6on+vtPSfp7nNyySibfAgh0kc8A69zgQGl1PPAdOAF4LuR3rmysjiOpx47Doed3FxzDZaqqtDL5qaTP7xRBxjMn1HB//rlZprbehlfXsBnr17ImpXmIKt/X+65dTlf/OGrPPPmIf7pb8+LeLaNx+Nhw84TTK8u4fyV01KyIUOmvCaRkL6MPUeOndxcB6WlBQCUlxeFbWu69iVW8QR5B3AhsAboAp4HPgc8GsmdW1q6cKfhCKfb7aG3z5wtki7rpPhvfxd4Rump07288s5R1PRxPPbi7qE5601tvfz0j9vp6OzjujXzRvTlutWz+MNrB/jr5kOsmBfZHqN1De0cqG/ntivm09zcldhORqCqKnvWYJe+JIfT6aK/f5COjl4A2tq6acoNXcBI577YbEZMyXE8Qb4ReEVr3QSglPoTcC4RBvl0lW57vAZufxd4RumfNx7CZjM40dwd9KSk3/1V89zGQzS19Q77grh05VQ27jzBk6/sp2ZmBbk54behW7flKAV5Dqm/i4zh29M1nT7TyRZPTf4F4Eql1DillB24Gng/Mc1KnWTW5D0eD/poG69vOx6yPh5s+zvfGaUnWrp5q7aRi1dMoa1r5Fx1gO4+F01tZhbj+4LYXNuIw27j05fPp7m9j5e2HAnb1vpTXby/r4nLz54qm16IjGLh+A7EEeS11m8D/w5sBHYDR4BHEtSulLEZRtLeFE+9XscPf7eN3/xF851fvc3r246POCbUmaMtHf08t+EQuQ47H/nQjIhPPvJ9QQAsmFHOeYsm8tKWo2EHYf+04SD5uXYuOzv+E6mESBqZQxnfPHmt9cNa68Vaa6W1vkdrHfvk6zSRrFUot+1rYt07R1mzfDI/+PyHqJlVwW/+otmwo2HYcaGCd1lRDu/uPcUV50yjtCiXmy6aM+KkpFD8vzhuvXgudrvBY2v3hhwj2XGgmW37m7lm1QyKC8JvDCKESB9yxmsAwzDGbEB4c20j9z60iTvue42HnvuAccV5fOry+VRXFHL3jUuomVXB43/R7D3SNnSfYME712GjuCCX4oIcrjrPPPEp2ElJxQXByyr+XxzlJXl86rJ57D16muc2HhpxbEf3AL99WTOpspArg5xkJYRIbxLkA9gMY0x2hvINoPqyaJfbQ2fPAO/uPQVAjsPGF69fzITyAh567gOaT5t19GDB+5KVUzne3M21q2YMq4+vqqnm/i+t5uFvXcL9X1rNJy+bH9GSAxcsncz5SybxwluHeXHz4aExid5+Jz99dicdPYPcee0iHHZ5u4jMItUaWaBsBJttbLb/CzaA6nJ7hi3JW5jv4Ms3L+V7j73Hg8/s4tufWcnW/U3Dpk9eu3omL2w6zKTKQgryHdz70KaQm3X4/h1sdk2gz16lGHS5eWb9QXbVtTC9uoRt+5po6xzgC9fXyCYeImNZeWYNSJAfwWYYeMagXDPaAKq/6opCvnh9DQ88tYN/f3Ir9ae6hm3I8Zt1GrcHrls9kyde3hdyaqXPqprqoPPkAznsNu66dhFzp5Txyvv1vLmjgVnVpXz+uhrmTR0Xc7+FSKUz5+tZN9JLkA9g2MZmFcrK0ryggT7YwOri2ZXcsmYuf3z9wIjb3B4ozLOzadeJhG/WYbMZXLpyKpeulCULRHZKxVnaqSZF1gD2MRh43VzbSP+ga8T1oy3Je+W5oacq9vS7Iv5lIITVeSycxYME+RFsNgNXAot4vgHXrt7huygV5dtHXZLXMIyQ0ycrS/NGvU0I4WO9zD2QBPkANoOE1uSDDbgC9Pa7+NWfd3PvQ5vYXNsY9L6hpk/edNGcUW8TQvixdiIvNflAZk0+ce+KUOUT3/dIqAFT/8uhFicLd5sQVmfBEvwIEuQD2AwDdwLP2w014OpvtAHT0TbkkM06hBDhSLkmQKJPhop0uQEZMBVibHiw9lx5yeQD2BNcrvFl2s+8cYDWzuArRYIMmAoxFgKrNVas3kgmH8CwJX4K5aqaar56y3IALl4xRQZMhUgmK6fxSJAfwWYwJguUHT1pnnF66cqpI9aiGW0qpRAiDlZM3QNIuSaALcHlGp/6pi4cdhsTKwqYPL5IgroQIikSkskrpX6klHo0EY+VaomeXeNTf6qLKeOLsNvkx5MQyWTtYk0CgrxS6lLMDbyzwlgtNVzf1M3UCUUJf1whRGiG1GviC/JKqQrg+8APEtOc1LONwcBrR/cA7d0DTKuKfqd1IUR8LD7uGndN/pfAt4Gs2fhztJr85trGmM4wrW/qAmDKBAnyQiSVzKGMPcgrpe4EjmmtX1VK3R7t/Ssr0zPgFRXmDv27qqpk6N9vvH+Mx9fpodUkWzr6eXydprQknzUrR/+Oa9tt7v60fEE140pSMx/evy+ZLFv6AdKXZMhx2Mlx2CgtLQCgorwobFvTtS+xiieT/zgwSSm1HagAipVSD2itvx7JnVtausZsL9V49PcN4vRu0uG/0cajL9SOWC64f9DFoy/UUjN99E019h5qprQol8G+AZr6Qp8QNVaqqkrCbhqSCbKlHyB9SRan0wUeDx0d5naarW3dFDpCp/Pp3BebzYgpOY45yGutL/f925vJr4k0wKezUOWaeNZvr2/qZlqVDLoKIZJP5vMFsNmCb/8X6/rtLrebhuZupko9XoiU8Fh85DUhQV5r/ajW+vZEPFaq2QwDV5AgH+v67afaehl0upkqM2uESDoLjrOOIGe8BrDZCFqu8c2ieeKv++jpc1JRksvNa+aGnV1z7JQ5s0aCvBCpY+VcXso1AWyGgccT/CfenMml9PSZ2/hdee6MCKdPdmMzDCaPL0x4W4UQYQTsGmLFzF6CfACb900RbOLP5tqTGAZUjcvntW3HI3q8+lNdTKwoIMdhT2QzhRAiIhLkAxg2b5APEuUPn+hgcmURl589jZOtPZw63Rv28eqbupgmg65CpIzFx10lyAey+4J8kHfG0VNdTJ9YzOLZlQDUHmod9bF6+pw0t/dJkBciRaxYngkkQT6Ar1zjcg1firKrd5C2zn6mTShhYnkBpYU5HDzePupjHW+WQVchUs3iibwE+UDeRH5ETb7JW5qZWFGAYRjMmlTKocbRz4zzzayRTF6I1DAklZcgHyhUTb6lvQ+AytJ8AGZNLuVEcze9/c6Qj1V/qovCPAflKVqvRghhsvIJURLkAwzNrgkI8s2+IF9mBvnZk0rxAIdHyeaPNXUxdUIxhqQTQqSOf4C34GdRgnwAW4iB19aOPvJz7RTmmeePzZxUCsChEx1BH8ft8XjXrJFSjRAidSTIB/DNrnG5Aso1HX1UluYPZeW7DrZgsxk8/UYd9z60ic21jcOOb27vo3/AJbtBCZFi1i3UmCTIBzCGBl6HvzU6ugcYV2yuNb+5tpHH1u4dKum0dPTz2Nq9wwJ9vW85Axl0FSJlpFQqQX6EUDX5jp4BSorMIP/s+joGnMOnWA443Ty7vm7o8tGTnRjAlPGSyQuRSpLJi2FC1eQ7egYp9e4aFcna8gcbOphcVUR+rqwBJ4RIHQnyAYJl8v2DLvoHXJQU5gDh15Z3ezzUNbQzd0rZGLdWCCFGF1eaqZT6Z+BW78UXtdb/EH+TUsvuP0/e++/1283FyJ5Zf5A3th1n6ZxKNu1qHFay8V9bvqG5m95+lwR5IdKB/wzK1LUiZWLO5JVSlwFXACuA5cBKpdSNiWpYqvgGanwbh2yubeTpN87U2ls6+tm0q5HVS6qHMncD+MxVamjp4QPe5Q4kyAuRWjLuGl+55gTw91rrAa31ILAHmJ6YZqWOzfsX8ZVrnl1fN7Sxt8+A083Ouhbu/9JqPn/dIjzA5MozA6x19e0UF+QwobwgWc0WQoTgsfjQazwbedf6/q2UmodZtlmdiEal0pn15M9MjwzGd/2C6eUA7DnSxqxJpbg9HmoPt6Kmj5PpW0KkmHwCE7D9n1KqBngRuFdrvT/S+1VWpuf88fKWHsDM5KuqSqgqL6CpbeS68VXlBebtVSXMmVrGrkOtfO6ji9l3tI3TXQNceNZUqqpKkt38kNKpLfHIln6A9CUZcnIduDxQWmL+qq6oKArb1nTtS6ziHXhdDTwDfE1r/fto7tvS0hV0Y45U6+ww16hxuT00NXVyw/mzePjFPcM298512Ljh/Fk0NZnr1iyfU8kz6w+yS5/k5XeO4rDbmDWheOj2VKuqKkmbtsQjW/oB0pdkGRxwMjjooqPTTNRaW7vJH6VInc59sdmMmJLjeAZepwHPAZ+KNsCnM1vAKpSraqpZOKN86GdfZWken7t6wbD9Xc9fOplch40Hn97Jxl0n+FDNRIoLcpLddCFEIG/J1MKLUMaVyX8TyAf+Qynlu+4XWutfxN2qFBpaT94vcy8ryqWiNI/7vxR8yKGsKJdbLp7LE3/dx/iyfD7mnUophEg9//huxWGyeAZevwp8NYFtSQu+TN7l99Xf3eekIG/0zPzSlVM5Z8EECvIc5DjkHDMh0oEFY/oIcs59gGBnvPb0OynKD/+nKvWubSOEEOlCUs4AgTV5gJ6+QQojCPJCiPRj5Xo8SJAfYWg9efeZJQt6+p0S5IXIRFKvkSAfyGE3/yRO5/CafGGYmrwQIl1ZO5WXIB/AYTe/+gddZibvdLnpH3BFVJMXQqQXw5vKW3lpAwnyAYYyeW+Q7+13AlAgQV4IkYEkyAewBwT5nj4zyEsmL0RmkoFXMYyvXOP0rhXf483kpSYvROax4slPgSTIB3DYhmfy3X2DADK7RogMZfFEXoJ8IHvAwKuvXCNBXgiRiSTIB/DNk/dNoTxTk5dyjRAZyeKpvAT5AIZh4LAbUq4RIgsMleQtHOglyAdht9nOzK7pd2K3GeTKomNCZDwr7tYmkSsIh90Yml3T22cuaWDFN4cQ2cDKJ0KBBPmg7HbbmYHXfieFeVKqESITSXIW//Z/nwK+A+QAP9Za/2dCWpVi/jX5nj5ZnEyIjGbtRD6u7f+mAN8HzgeWA59XSi1KVMNSyWGzDc2u6ZVMXgiRweKJXpcBr2mtWwGUUk8DHwP+LRENS5XNtY20dPSxfls9H9Q14XJ7mDt1XKqbJYQQMYknyE8GTvhdPgGcG19zUmtzbSOPrd2Ly7thSEtHPwBdPQOpbJYQIg4erF2xiSfI2wjYIxdwhzh2hMrK4jieemw8t3EzA86RXThysouqqpIUtChxMr39PtnSD5C+JENengOHw0ZpST4AlRVFVFWNHnvStS+xiifI1wMX+F2uBhoivXNLS9ewLfbSQVNbb9Dre/udNDV1Jrk1iVNVVZLR7ffJln6A9CVZBgacDA666ejsA6C1tZucUfL6dO6LzWbElBzHM4XyFeBSpVSVUqoQuBlYF8fjpVxlaV7Q62WZYSFEpoo5yGutjwPfBl4HtgO/01q/k6iGpcJNF80JembruQsnpqA1QggRv7hSVK3174DfJagtKbeqphqAR9fuZdDpprQoh47uQZbOqUxxy4QQsUuvsnCyyRmvAVbVVLN0TiXTq0u481pz2r+cDCVEZpIzXiXIB+Ww23A63WfWkpeToYTIWJ6h/1mTBPkgHDZzWQPf1n8FEuSFyEgj8ngLJvYS5IOw220MOt309suuUEJkPAtn8SBBPqjcHBt9Ay56+pzYDIO8HHuqmySEiIUFM/dAEuSDKMxz0NvvpLt3UNaSF0JkNAnyQfhq8K2d/TLoKkSGs3i1RoJ8ML4g39LeR4HU44XIWPIbXIJ8UL7svbm9TzJ5ITKcx+Ox9BaAEuSD8GXy/YMuxhXnprg1QoiYBYynWTGzlyAfhP+8+LLi4IuWCSFEJpAgH0RB3pkpk+MkyAshMpgE+SD86/BSrhEic1mxPBNIgnwQBcOCvGTyQmQyj3XHXAEJ8kHl+K0pP74sP4UtEULEQ85jjGM9eaXUauABIBdoAe7QWh9JVMNSyTAMfvuvV1F3pJWKUgnyQmQ6K2fz8WTyTwB3aq2Xe//9YGKalB7KivOYNiH9NhsXQkRnWHy3YGofU5BXSuUB39Fa7/RetROYnrBWCSGESIiYyjVa637gtwBKKRvwL8BziWuWEEIkiJVrNUQQ5JVSt2DW3v3t1VpfppTKBR7zPs4Ponniysr0L4VUVZWkugkJky19yZZ+gPQlGfLzc7DbbZR6x9YqK4qoqiwa9T7p2pdYhQ3yWuungKcCr1dKFQPPYw66Xq+1HozmiVtaunC70/cbtqqqhKamzlQ3IyGypS/Z0g+QviRLf78Tl8tNR0cfAC2t3djd7pDHp3NfbDYjpuQ4noHX3wIHgI97yzdCCJF20jeVTI6YavJKqRXA9cBuYKtSCqBBa/2RBLZNCCHiYr25NCPFOvC6Dfn7CSEygV8qb8WgJWe8CiGylxWjegAJ8kKIrGblDUNAgrwQIotJIi9BXgghspoEeSFEVrP4Ca8S5IUQ2cws2Fg50EuQF0JYhhVr9BLkhRBZy4IrC48gQV4IIbKYBHkhRFazcj0eJMgLIbKYVGskyAshsp61U3kJ8kKI7OVN5a28tIEEeSGEdViwfiNBXgiR1aybw5skyAshspZhxdQ9QNxBXim1Qikl2/8JIdKSTKGMg1KqEPgpkJuY5gghRAJJIh/b9n9+/h/wY2B1FPexg7nzeLrLhDZGKlv6ki39AOlLMpQW5TJ+XAGF+Q4mlBeQ47CFbWu69sWvXfZo7md4Yvwto5S6DrhZa/05pZRHax3pX+Z8YENMTyqEEOICYGOkB4fN5JVStwAPBFy9FygFLouqaaZ3MRt5AnDFcH8hhLAiOzAJM4ZGLKZMXil1J/CPQKf3qmXADuACrXVnyDsKIYRIqpjLNf6iLNcIIYRIEpknL4QQWSwhmbwQQoj0JJm8EEJkMQnyQgiRxSTICyFEFpMgL4QQWSzeZQ0ynlLqU8B3gBzgx1rr/wy4fTnw35gnf70JfEFr7Ux6Q8OIoB/XA/+KuZrHIeBvtNZtSW9oBML1xe+4a4Cfaa1nJbN90YjgdVHAL4FyoBH4RKa+LkqpszD7kgscA27TWp9OekMjoJQqBd4CrtVaHw64LSM+85GydCavlJoCfB9zqYXlwOeVUosCDvstcI/Wej5mgLwrua0ML1w/vG/onwPXaK2XATuBf0lBU8OK8DVBKTUR+BFpvARVBK+LATwP3Od9XbYB30pFW8OJ8HX5CfBP3r5o4JvJbWVklFLnYS4LMD/EIWn/mY+GpYM85rIMr2mtW7XW3cDTwMd8NyqlZgAFWust3qseBW5JeivDG7UfmJnX3Vrr497LO4HpSW5jpML1xee/MX+ZpLNwfTkL6NZar/Ne/gEQ9FdLGojkdbFjZr8AhUBvEtsXjbuAu4GGwBsy6DMfMauXayZjrqHjcwI4N8ztU5PQrmiN2g+tdQvwJwClVAFmtvjTZDYwCuFeE5RSXwG2AltIb+H6MhdoVEr9GlgB7AG+nLzmRSXs6wJ8A3hZKfVjoBs4L0lti4rW+k4As1I2QqZ85iNm9UzexvDdwQzAHcXt6SKidiqlyoAXgR1a68eS1LZojdoXpdRi4Gbge0luVyzCvS4OYA3wc631WcBB4D+S1rrohHtdCoBfA5dprScBDwGPJ7WFiZEpn/mIWT3I12Ou6uZTzfCfcOFuTxdh26mUmoS5xPNO4M7kNS1q4fpyi/f294CXgMlKqXRdujpcXxqB/Vrr97yXn2RkdpwuwvVlMdCrtX7He/mXmF9gmSZTPvMRs3qQfwW4VClV5d3l6mbAVx9Fa30E6FNK+TZF+QywNvnNDGvUfiil7MCfgT9qrb+mtU7ntSzCvSb/rLWer7VeDnwEaNBaX5CitoYzal8wZ3dUKaWWeS9/FHg/yW2MVLi+HACmqTM1kOuJckncdJBBn/mIWTrIewcivw28DmwHfqe1fkcp9ZJS6mzvYZ8GHlBK7QWKgQdT09rQIujHdZiDfB9TSm33/vffKWxySBG+JhkhXF+01r3AjcCvlFK1wCXA36euxaFF0Jc24Hbgj0qpncAdwN+krMFRyrTPfDRkgTIhhMhils7khRAi20mQF0KILCZBXgghspgEeSGEyGIS5IUQIotJkBdCiCwmQV4IIbKYBHkhhMhi/x8+j2CiuVeotgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = PolynomialRegression(30)\n",
    "model.fit(X, y)\n",
    "y_test = model.predict(X_test)\n",
    "\n",
    "plt.scatter(X.ravel(), y)\n",
    "plt.plot(X_test.ravel(), y_test)\n",
    "plt.title(\"mean squared error: {0:.3g}\".format(mean_squared_error(model.predict(X), y)))\n",
    "plt.ylim(-4, 14);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "When we increase the degree to this extent, it's clear that the resulting fit is no longer reflecting the true underlying distribution, but is more sensitive to the noise in the training data. For this reason, we call it a **high-variance model**, and we say that it **over-fits** the data."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Just for fun, let's use IPython's interact capability (only in IPython 2.0+) to explore this interactively:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "377b0c08fb2a4d4cba87d708c83f449e",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "interactive(children=(Dropdown(description='degree', options=(1, 5, 10, 15, 20, 25, 30), value=1), Dropdown(de…"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from ipywidgets import interact\n",
    "\n",
    "def plot_fit(degree=1, Npts=50):\n",
    "    X, y = make_data(Npts, error=1)\n",
    "    X_test = np.linspace(-0.1, 1.1, 500)[:, None]\n",
    "    \n",
    "    model = PolynomialRegression(degree=degree)\n",
    "    model.fit(X, y)\n",
    "    y_test = model.predict(X_test)\n",
    "\n",
    "    plt.scatter(X.ravel(), y)\n",
    "    plt.plot(X_test.ravel(), y_test)\n",
    "    plt.ylim(-4, 14)\n",
    "    plt.title(\"mean squared error: {0:.2f}\".format(mean_squared_error(model.predict(X), y)))\n",
    "    \n",
    "interact(plot_fit, degree=[1,5,10,15,20,25,30], Npts=[2, 10, 50, 80,100]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Detecting Over-fitting with Validation Curves\n",
    "\n",
    "Clearly, computing the error on the training data is not enough (we saw this previously). As above, we can use **cross-validation** to get a better handle on how the model fit is working.\n",
    "\n",
    "Let's do this here, again using the ``validation_curve`` utility. To make things more clear, we'll use a slightly larger dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAEBCAYAAABysL6vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAHURJREFUeJzt3X2QXXV9x/H3PoRkSXabsOy4WEmhAX7AKj5QdVJw2KmoTZWIVPpALSAjtaNWrUqnM2ptp7WD1bE+FbUoDRkr9QkZjYZR1KDE+JSKYRb4qSl0QmGnyxKbBDYhyW7/2L3L3bvn3PN8zu/8zuc1wwx7H3/nnpvv/Z3v73u+p2dubg4REfFPb9UDEBGRYijAi4h4SgFeRMRTCvAiIp5SgBcR8ZQCvIiIpxTgRUQ8pQAvIuIpBXgREU8pwIuIeEoBXkTEU/0VvOdK4PnAI8DxCt5fRKSO+oBTgB8DR+I8oYoA/3zgexW8r4iID14E3BXngVUE+EcA9u9/nNnZbJ0sh4fXMD19KJdB1YG212/aXr9l3d7e3h7WrVsNCzE0jioC/HGA2dm5zAG+9TpNou31m7bXbzltb+zUthZZRUQ8pQAvIuIpBXgREU8pwIuIeKqKRVYRkULtmpjk1jv3Mn3gCMNDK7nsog1sHButelilU4AXEa/smpjk5u338+SxWQCmDxzh5u33AzQuyCtFIyJeufXOvYvBveXJY7PceufeikZUHQV4EfHK9IHgs/jDbveZAryIeGV4aGWi232mHLyIeOWyizYsycEDnNDfy2UXbQCatQCrAC8iXmkF66Ag3rQFWAV4EUnF5ZnwxrHRwLF0W4B1Zex5UoAXkcTqOhNu2gKsFllFJLG6liI2bQFWAV5EEqvrTPiyizZwQv/SsNe+AOsbpWhEEnI591yW4aGVgcHc9ZlwtwVYHynAiyRQ19xz3qJKEV0WtgDrI6VoRBKoa+45bxvHRrlq09mLM/bhoZVctensxgTOutAMXiSBuuaei9CkmXBdaQYvkkDTqjCk3hTgRRJoWhWG1JtSNCIJNK0KQ+pNAV4kIeWepS4U4EXESWnON9A5CkspBy8izmmdb9CqTmqdb7BrYjLRc2786r28+cPf7fo8nynAi4hz0pxvEPQcgEMzxyJ/HHwVK0VjjBkCvg+8wlr7oDHmYuCDwADwOWvtuwoco4jEFJWiqEsKI835Bt3u87klcDeRM3hjzAuBu4CzFv4eAG4CXgmcAzzfGLOpyEGKSLSotEaatEdV0pxvEHUuQhNPRouTorkWeCPw8MLfLwB+Ya19wFp7DPgMcHlB4xORmKLSGnHTHrsmJrnuhp1cc/23ue6GnZX8AKQ53yDoOe2aeDJaZIrGWvs6AGNM66anA4+0PeQR4BlJ33h4eE3SpwQaGRnM5XXqQtvrtyzb+1jIDPWxA0cYGRmMvB9gx+59bL3dcuTocWB+1rv1dsvQ4CrGzz819djChG3v5vFBhgZXsXX7fTy6f4aT1w1w5aZzuo6h9Zx/ve0eDj5xdMl9K1f0cfUrxir/PpX9/mnKJHuBuba/e4DlKxsRpqcPMTs7F/3ALkZGBpmaOpjpNeokz+2tQy5W+zeZk0Ja+J40tJKpqYOR9wNs2TaxGNxbjhw9zpZtE4ytX7t4Wx7fn6jtHVu/lve9fuOS26I+nwMHDy/O4nt7YHaOxfGNrV/L1NTByr77Wfdvb29P4olxmiqah4BT2v4e5an0jdRAnXKxEl9UWiNO2iPO4qar35/Occ3OPbV9rQDu6tiLkmYG/0PAGGPOAB4ArmB+0VVqomkXHq6zJLPNqDYKcdosxLmQxy13/NzJ70+c73XTvvuJA7y19rAx5mrgS8Aq4OvAF3MelxRILW/rIc3FRaLaKETdH3Uhj10TkxyaORb43Kq/P3G+10377scO8Nba09r+/1vAs4sYkBSvrpdba5oqZptRs/xuJxpV/f2J871u2ndfvWgaKO3l1uqwMOuTImeb3fZlt1l+t/euumVynO91nS81mIYCfAOlaXmra5GWr6jZZpZ9GTam1av6Kv8exPled3tMEROY9tccWTfApReeXurnpADfUElb3jZtccoFec422wNNq3ywXdx9GTamK15iujyrPHG+10GPKWIC0/maU/tnSp8UqdmYxNK0xSkX5HVh66DywSBx9qWvF9su4mLqLlygXTN4iaVpi1OuyOPiImFdFoPsmphMNQOuuyImMC5MijSDl1h0LdJ6ae8nkySglDm7dEkRF1N34QLtCvASi6+H5j7qTMkk0dSUWxETGBcmRUrRSGw+Hpr7WPqZJCXTKe7s0rfPrYiLqXe+pqpoRErkY+nnronJ1LPwuLNLHz83KGYC0/6aVTTPU4CXxvKt9LMVeMOsXtXHkaOzHDu+vIwmyYzVt88trTocxSjAS2OVVeVQViDolpo5ob+XF5zzNL5799LGr309cM0rzg2sCw8bswvVIWll3Rftz2/n6lGMFlmlscqociizPW23AHvVprPZs3eazsn78bnllTNRY3ahOiSNrPsiavG67Br3OBTgpbHKqHIo82SXboF349ho7Jl31JhdqA5JI82+aC83/fS2eyMXr107ilGKRhqriMqJTmnTGWlSCVGtDeKerBY15jI+tyIk3Redi8lxLkDn2lGMArw0WtGln92ac4VJW6USFXjj9raJ80NQx5LZ1av6ePzw8cDbgyQtN3XxKEYBXpxXh2qFMJddtIGbtt27LPd95OhsaFuALFUqnYG3lWJofXYXPGuUPXunu36WvrXUbX1/goI7QE9PT+DtSdMtFzzLvR89BXhxWpLZrIs/BBvHRrnljp8vuwrSseNzoQE7ryqVoM9u5z2TkWcg1zUFE6TzMwgSdoWqsCOZMHv2TiceX9EU4CV3eQbauLNZV06+Cdr2pJe4y6uxW55HAnUVJ80S9rkGHcl049oCKyjAS87yDrR5VH6UFajCtn3NQH9gkO/tgWuu//biD8Hm8UEgvxSJq/XqrR/Bxw4c4aSCjw6itrXzc+38gb7gWaPceffDtVxgBZVJSs7yLAvcsXsfvcHp0cSVH2UI2/a5ubllZYXwVFVG64dgx+59QH6N3VysV2+vJZ+j2PMCoPu2dn6uQXXyO++ZjBXcXV2j0AxecpVn/njr7Tb0H9fhJ48tWaQsu199UCombBsfP3ycay85N/KKSlu338f7Xr8RyCdF4uJiadlHWmGfQdAPZtjYgvYXsHi7y2sUCvCSqzzzx0eOBlc9wHzQbE/9lBnMkqZiWicatQLANdd/O/B1H90/k+s4wxZLgSWVNWUGp7KPtJIsGIeNYXZu/rsU50fCNQrwkqui88ft2md+ZVZ+hM30VvT3BAaCzhxvmJPXDeQ+1qCyySoXo6u4Mljco6FuY7vsog21rCpSgPdM1aWCeQXauCVq7Y8puvIjrNFUS2cqJmjbu61FXLnpnND3y2tfVr0Y7WLaqKXb2OpaVaQA75GqZ2cteeWPt95uu6ZpoNiZX3uA7dZqt30sUdve7Udr/PxTF/uFF7Uvq1iMDqpM2bN3upQqmiR8qv9vUYD3SNWzszy0B4PBE1ewor+HQzPHWDPQz8zhY0vOCC1y5tcZYMPOgkw6lrgpiqL2ZRWL0WEnW20eP7P0C2BEqetMPYwCvEdcKBXslCTN0BkMDj5xlBP6e7n2knMB+Ow37WKgXTPQzx9ffFZh/xiT9CFJMtOLm6Ioal/mlSKJu1+7/VBtHj8z3UZIbArwHqliAaubpGmGsGBwyx0/58mjs0vuOzRzjBu/ei+33rm3kMPouIF0eGgl73/DBbFfN24aoKh9mUcaIsl+dWHSUfW6VJUU4D3i2gJW0jRD2D/6sFP9W88pYp0hziJv2s82ThqgyH2ZNQ2RZL9WPelwZV2qKpnOZDXGvMYYM7Hw3wfyGpSkk9cZkHlJOntL+4++iAtoBF3Uoq9nPjUExX+2ru3Ldkn2a9UXBynzgisuSj2DN8acCHwEOAv4FbDTGHOxtfaOvAYnybm0SJR09hY2a13R3xO5yJn3Ib8LFRUu7ct2SfZr1Z+jCymiKmVJ0fQxfwSwGngcWAHkeyqelCpprjLq8UnTDJ3BYGTdAJdeeDpAZFe/Ig75XQ2wVUuzX4M+xx2797Fl20Shgb/qFFHVUgd4a+1BY8y7gfuBJ4A7ge/nNTApV9JcZZzHp5m9tQeDkZHBJWV0YScZuXKiTBjfFvnyWqhtP8+hqNx4FetSLu3vnrm5GK3SAhhjzgNuBl4G/B/wGeBH1tr3Rzz1NOCBVG8qhbnmH77BVEAvlJF1A9z0rpfGfvzgiStYtbKfR/fPcPK6Aa7cdA7j55+a61h37N7H1u33Ffoeedmxex8f+8LPlpywtXJFH2+6/NnOjrkMSb9vWZT5fSlpf58OPBjngVlSNC8DvmWt/V8AY8wW4A1AVIAHYHr6ELNx+nB20TnD812R2xv0j611e9B7hj3+4BNHOfjE0cXHfPTzd3Pg4OFUM5iw7R1bv3ax6+LieBz9HmzZNrHsbNwjR4+zZdsEY+vXLrm9Sd/npN+3LMr8vnTb3+1nKqfR29vD8PCaZM9J/W7wM+BiY8xqY0wPcAnw4wyvJxUKy0m2Lkpx3Q07lzTKipvDbFLFQpCmL/KFcbFXfR5c299ZcvDfMMY8F9gNHAV+BFyf18CkXGGXJ+u8KAWEt+cNk+TL3Z6/bC2yupavTpJjbfoiX5igXkOur6XE4dr+znSik7X2fcD7chqLVKhz4SzsohTd2vMefvJYYDnj6lV9scbQuXA7tX/GuZNSki5Gu3bymSs2jo0yNLiq8Cqasrm2v3UmqyyKc1GKbu15d01MctO2e+lsuHjk6OySqy+FqUOztKRjrLoO3GXj55+6bB2i7lzb3wrwEijNoebGsVFuuePny1oLHDs+FytIu5a/DJJmjL7W07tUDugSl/a3ArwESnuoGdY3Jk6QjvpRcSGguJZjrUrTe7zURaZeNOKvtL1QslRHdOtbEnTF+5u339/1EnhFqLq3iit87PGya2KS627YGVg1VleawUuoNIeaWRaZwloVbBwb5bobdjqRn3ctx1oVV9NpaY/yfD0iUYCXXGUNgGGtClwKKC7lWKviYqoqS5CuwwJ/GgrwkrsiAqCLAaXJXCsHhGxB2qUJRJ4U4MWJxcsoLgaUJnMxVZU2SHfLtdd9AqEAX7Gyg2vn+523YZid90w6n3t0MaD4JM330LVUVdqjvG4Lw3WfQCjAV6jshZ2g9/vOTx9e9jhXc4+uBRRf+LLAmPYoL+ochjpTmWSFyi41C3q/MHXPPUp8vpQ8VlHa6zrN4CtU9sJOktd17ctdh3WCuvJpgbHs0l7XKcBXKCxnuGagn+tu2Jl7MAt7v06ufbmTpBD0Q5Bc0yuUfF7fUYCvUNDMob+vh5nDxxZP+W8PZpvHB3N/vxP6e7ngWaPs2Tvt7Jc7bvmbL7nkooT9+Pk8g43L1/UdBfiCxJlJxm252wpmm8fPzDSmuDOV1inbrgT8uCkEX09WyUOcHz8fZ7BNpwBfgCQzyc6ZQ5w2vVlEzVRcnAXHTSH4lEvOW9SPn68z2KZTFU0BslQlVL2i72JFRdwGX1V/dkXIqwGWfvyaSQG+AFn+MVXdrdDFQBC3/K3qzy5veXbQ9PHHT6IpRVOALFUJUfnQoqtEXK2oiJNC8C2XnOeaghZSm0kBvgBhF6Q+b8NwrOeHBbMdu/cVnh+veyDwKZec59GUbz9+Eo8CfAE2jo3yy4d+tawNwM57JjnjGWtT/6Pauv2+wqtEFAjckffRlE8/fhKPAnxB9uydXnZb1mD86P6ZwNvzzo8rELih7kdTUj0F+IIUsVh58roBpgKCfNX5cSmGjqYkKwX4ghSxWHnlpnP46Ofv1oyuQXQ0JVmoTLIgRZTsjZ9/aqpueSLSTJrBFyRJW4A4h+C7Jia57a5dTO2fYXhoJddecq4Cu4h0pQBfoLzaArjSPkCdGkXqRSmaCsVtC+BC+4A8z6oUkXJoBh9Tltlr2HPjVtq40D5AnRpF6idTgDfGXAK8B1gNfMNa+5ZcRuWYsBTJLx/6VWQf9W7plbiVNi60D3DhR0ZEkkmdojHG/CbwCeBS4DzgecaYTXkNzCVhs9fv/PThyJRFt5lv3EobF5poqVmVSP1kycG/CvictfYha+1R4A+BH+YzLLfEnaUG5cW7zXxbwb+3Z/62sLLHVjfFkXUDXR9XJBd+ZEQkmSwpmjOAJ40xXwHWA9uAd+cyKsfEvZYpLA/o3Z7bun127qlgGRa0N46Nsnn8TKamDiYYeX50VqVI/fTMzc2leqIx5kbgt4Fx4BDwFeDfrbVbIp56GvBAqjetyI7d+/jYF37GkaPHIx87sm6Am9710lyeKyIS4HTgwTgPzDKDnwTusNZOARhjvgy8ANgS58nT04eYnU3349IyMjJYyox2bP1arvxds2T2et6GYXbeM7msbcClF56+ZExBzw2b0U/tn+m6PWVtryu0vX7T9ibT29vD8PCaRM/JEuC3ATcbY9YCB4FNwG0ZXs9pQSctnfGMtbFSFp3PbV3QupMWLEUkT6kDvLX2h8aYfwLuAlYA3wT+La+B1UHaRlBJ2sC219CPrBvg0gtPV95bRGLJVAdvrb0JuCmnsTRGkj417T8EU/tnKmlRUDW1SBBJR2eyliAsQEUFKZ096k4fHpE6Ui+agmXp4aKzR93owyNSVwrwBcsSoHT2qH7kRLJQgC9YlgCls0f1IyeShQJ8wbIEqFaLgtZjR9YNNO4KTvqRE0lPi6wJJano2DUxGXgGa5IA1b4Y27QTQ0AtEkSyUIBPIElFR+djW1av6uOKlxgFqAR04WmRdJSiSSDJgmnQYwFWndCvYCUipVCATyDJgqmqP0SkagrwCSRZMFX1h4hUTQE+gSQVHar+EJGqaZE1gSQVHar+EJGqKcCH6NY/Jm6QVvWHiFRJAT6AGlyJiA+Ugw+gBlci4gMF+AAqcRQRHyjAB1CJo4j4QDn4AEkuqdfSuSh73oZh9uydVgWNiFRGAT5A0hLHoEXZ7/z04cX7tUgrIlVQgA+RpMQxrO9Mu6Zdak9EqqccfA7iLr5qkVZEyqQAn4O4i69apBWRMinA5yCo70wn9aERkbI1Lgef5IpMcbWef+NX7w19TNMutSci1WvUDL5V7dLKhbeqW3ZNTGZ+7Y1jo13r5xXcRaRsjQrwRbcgUItgEXFJo1I0RbcgUItgEXFJowL88NDK0GC+a2Ky64lMcYO2WgSLiCsalaLplioJS9MUmbcXESlS5gBvjPmAMWZLDmMpXLeZddjMXq2DRaSuMgV4Y8yLgatyGkspknaKVOtgEamr1AHeGHMS8F7gH/MbTvGSVrqodbCI1FWWGfwngXcC+3MaSyk2jo1y1aazFwP08NDKrichqfRRROqqZ25uLvGTjDGvA8611r7NGHM1MG6tvTrm008DHkj8phXasXsfW7ffx6P7Z1hz4goADj1xlJPXDXDlpnMYP//UikcoIg1yOvBgnAemDfDfBE4BjgEnAWuAm621fxnj6acBD0xPH2J2Nvl7txsZGWRq6mCm10iis+87zM/my2pDUPb2Vk3b6zdtbzK9vT0MD6+BBAE+VR28tfYlrf9vm8HHCe611q2iRrXvIuKaRtXBZ6WKGhGpk8xnslprtwBbMo+kBsLOhFVFjYi4SDP4BFRRIyJ10qheNFmpmZiI1IkCfEJqJiYidaEATzFXeRIRqVrjA3xnbXurWyR0b04mIuK6xi+yqlukiPiq8QFete0i4qvGB3h1ixQRX3mTg0+7UHrZRRsC+8uotl1E6s6LAJ9loVS17SLiKy8CfNYmYKptFxEfeZGD10KpiMhyXgR4LZSKiCznRYBXEzARkeW8yMFroVREZDkvAjxooVREpJMXKRoREVlOAV5ExFMK8CIinvImB99O/d1FRDwM8OrvLiIyz7sUjfq7i4jM8yrA75qYVNsCEZEF3gT4VmomjNoWiEjTeBPgg1IzLWpbICJN5E2A75aCuWrT2VpgFZHG8SbAd+soqeAuIk3kTYBXR0kRkaW8qYNXR0kRkaUyBXhjzHuAP1j482vW2r/KPqT01FFSROQpqQO8MeZi4KXAc4E54HZjzKustV/Oa3BJqD2BiMhSWWbwjwBvt9Y+CWCMuQ9Yn8uoElJ7AhGR5VIHeGvtROv/jTFnMp+quSCPQSXVrT2BAryINFXmRVZjzBjwNeA6a+0v4j5veHhN1rcGYGRkkMdCauAfO3CEkZHBXN7HFb5tTxRtr9+0vcXKush6AfAl4K3W2v9I8tzp6UPMzs5leXtGRgaZmjrISUMrA090OmloJVNTBzO9h0ta29sU2l6/aXuT6e3tSTwxTl0Hb4w5FbgNuCJpcM+bauBFRJbLMoN/B7AK+KAxpnXbJ6y1n8g8qoRUAy8islyWRda3AG/JcSyZqAZeRGQpb1oViIjIUgrwIiKe8qYXTTc6y1VEmsj7AK+zXEWkqbxP0egi3CLSVN4HeF2EW0SayvsA3+1KTyIiPqtlDr61aPrYgSOcFLFoetlFG5bk4EFnuYpIM9QuwCddNNVZriLSVLUL8GlaA+ssVxFpotrl4LVoKiIST+0CvBZNRUTiqV2AV2tgEZF4apeDb180jVNFIyLSVLUL8PBUkL/trgeY2j+zeFaqgryIyFNqGeDVX0ZEJFrtcvCg/jIiInHUMsCrVFJEJFotA7xKJUVEotUywKtUUkQkWi0XWTuraNRfRkRkuVoGeJgP8pvHz2Rq6mDVQxERcVItUzQiIhJNAV5ExFMK8CIinlKAFxHxVBWLrH0Avb09ubxYXq9TF9pev2l7/ZZle9ue2xf3OT1zc3Op3zClC4Hvlf2mIiKeeBFwV5wHVhHgVwLPBx4Bjpf95iIiNdUHnAL8GIjVl6WKAC8iIiXQIquIiKcU4EVEPKUALyLiKQV4ERFPKcCLiHhKAV5ExFMK8CIinqpFP3hjzBXAu4AVwIestf/Scf9zgE8BQ8B3gT+31h4rfaA5ibG9rwT+DugBHgBea63dX/pAcxK1vW2PeznwMWvt6WWOL28x9q8BPgmsAyaBP6rr/o2xrc9jfltPAPYBr7HW/qr0gebIGDMEfB94hbX2wY77So1Vzs/gjTG/DryX+RYHzwH+zBhzbsfDPgO8yVp7FvNB79pyR5mfqO1d+PJ8HHi5tfbZwB7gbysYai5i7l+MMU8DPsD8/q2tGPu3B/gKcP3C/v0p8NdVjDWrmPv2w8DfLGyrBd5R7ijzZYx5IfNtBM4KeUipscr5AA9cDHzbWvuYtfZx4IvAq1t3GmN+Axiw1v5g4aYtwOWljzI/XbeX+ZnQG621/7Pw9x5gfcljzFPU9rZ8ivmjlrqL2t7nAY9ba29f+PsfgcAjmhqIs2/7mJ/NApwIzJQ4viJcC7wReLjzjipiVR1SNE9nvm9NyyPACyLuf0YJ4ypK1+211k4DXwYwxgwwP7v7aJkDzFnU/sUY82bgP4EfUH9R23sGMGmM+TTwXOA+4C/KG16uIvct8DbgG8aYDwGPAy8saWyFsNa+DmA+y7ZM6bGqDjP4XqC9YU4PMJvg/rqJtT3GmF8Dvgb8zFp7c0ljK0LX7TXGPBP4feDvSx5XUaL2bz8wDnzcWvs84L+AD5Y2unxF7dsB4NPAxdbaU4AbgK2ljrBcpceqOgT4h5jvoNYyytLDn6j76yZye4wxpzDfcnkP8LryhlaIqO29fOH+nwBfB55ujKlzu+mo7Z0EfmGt/cnC37ewfNZbF1Hb+kxgxlr7o4W/P8n8j5uvSo9VdQjwdwAvNsaMGGNOZH4218pPYq39b+CwMeaChZv+FNhe/jBz03V7jTF9wFeBz1tr32qtrXs70Kj9+x5r7VnW2ucAvwc8bK19UUVjzUPX7WW++mLEGPPshb8vAXaXPMa8RG3rL4FTzVP5jFcy3wrXS1XEKucD/MJi4juB7wB3A5+11v7IGPN1Y8xvLTzsT4B/NsbcD6wBPlLNaLOLsb2bmV+Ie7Ux5u6F/z5V4ZAzibl/vRG1vdbaGeBVwI3GmAngd4C3Vzfi9GJs637gauDzxpg9wDXAaysbcEGqjFXqBy8i4innZ/AiIpKOAryIiKcU4EVEPKUALyLiKQV4ERFPKcCLiHhKAV5ExFMK8CIinvp/n/OEkGVS09gAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X, y = make_data(120, error=1.0)\n",
    "plt.scatter(X, y);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import validation_curve\n",
    "\n",
    "def rms_error(model, X, y):\n",
    "    y_pred = model.predict(X)\n",
    "    return np.sqrt(np.mean((y - y_pred) ** 2))\n",
    "\n",
    "degree = np.arange(0, 18)\n",
    "val_train, val_test = validation_curve(PolynomialRegression(), X, y,\n",
    "                                       'polynomialfeatures__degree', degree, cv=7,\n",
    "                                       scoring=rms_error)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's plot the validation curves:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_with_err(x, data, **kwargs):\n",
    "    mu, std = data.mean(1), data.std(1)\n",
    "    lines = plt.plot(x, mu, '-', **kwargs)\n",
    "    plt.fill_between(x, mu - std, mu + std, edgecolor='none',\n",
    "                     facecolor=lines[0].get_color(), alpha=0.2)\n",
    "\n",
    "plot_with_err(degree, val_train, label='training scores')\n",
    "plot_with_err(degree, val_test, label='validation scores')\n",
    "plt.xlabel('degree'); \n",
    "plt.ylabel('rms error')\n",
    "plt.legend();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notice the trend here, which is common for this type of plot.\n",
    "\n",
    "1. For a small model complexity, the training error and validation error are very similar. This indicates that the model is **under-fitting** the data: it doesn't have enough complexity to represent the data. Another way of putting it is that this is a **high-bias** model.\n",
    "\n",
    "2. As the model complexity grows, the training and validation scores diverge. This indicates that the model is **over-fitting** the data: it has so much flexibility, that it fits the noise rather than the underlying trend. Another way of putting it is that this is a **high-variance** model.\n",
    "\n",
    "3. Note that the training score (nearly) always improves with model complexity. This is because a more complicated model can fit the noise better, so the model improves. The validation data generally has a sweet spot, which here is around 5 terms.\n",
    "\n",
    "Here's our best-fit model according to the cross-validation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = PolynomialRegression(4).fit(X, y)\n",
    "plt.scatter(X, y)\n",
    "plt.plot(X_test, model.predict(X_test));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Detecting Data Sufficiency with Learning Curves\n",
    "\n",
    "As you might guess, the exact turning-point of the tradeoff between bias and variance is highly dependent on the number of training points used.  Here we'll illustrate the use of *learning curves*, which display this property.\n",
    "\n",
    "The idea is to plot the mean-squared-error for the training and test set as a function of *Number of Training Points*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import learning_curve\n",
    "\n",
    "def plot_learning_curve(degree=3):\n",
    "    N_train, val_train, val_test = learning_curve(PolynomialRegression(degree),\n",
    "                                                  X, y, train_sizes=np.linspace(0.05, 1.0, 20), cv=5,\n",
    "                                                  scoring=rms_error)\n",
    "    plot_with_err(N_train, val_train, label='training scores')\n",
    "    plot_with_err(N_train, val_test, label='validation scores')\n",
    "    plt.xlabel('Training Set Size') \n",
    "    plt.ylabel('rms error')\n",
    "    plt.ylim(0, 3)\n",
    "    plt.xlim(5, 80)\n",
    "    plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's see what the learning curves look like for a linear model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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5y0suM2FF57PEUe8n0MOOQyAU089iQsuuJjOzk5uuulHJJMJ2ts7+Pznv8iiRYfk3rdmzWrOOecM7rzzLtasWc0VV1xCd3c3u+66W26blpZ1XH31Ejo62lm/voWjjvoQp512Jt/73rdYvXoV1133Td773sNyc1usXLmCa665kvb2Nqqqqjn33PPYeeddufLKy6itrcOYV1i/voVTTjmNo48+ptfP8eST/+ZHP7oepRT19fVcdtlVNDY28pvf/JI//en3uK7LgQcu4nOf+zwbN27gG99Ywtq17+C6Lp/5zFnsv/+B/OQnP+all15k3bp3+OhHT2Dffd/Dt751NW1trcTjVXzxi+czb958/vGPv3HHHb/AcRxmz57NJZcs6TWY4miTRDEUG5YqqhuG3lYIMWxHHnkU99zzVw455DBWrlxJKpVi3rz5XHzx/3DBBZew3Xbb89RTT/C9732rV6LI953vXMNRR32ID33ov/jb3/7C//7vHwC4556/8773HckHPvBBOjo6+MhHjua44z7OF75wHrfeehNf/vJXePrpJ3P7WbLkEk466RQWLz6UF198gYsv/gq/+lWwr3Xr1vKjH93CG2+8zjnnnNEvUfz85z/h/PO/ys4778ovf/lzXn11GfX19fzxj3dyyy23UVVVxZe//HmWLXuFX/7y5+y11z58/OMnsWrV23zuc6fx05/+EoBUKsntt/8OgM9+9lS++MX/Yd68+bz55htceOF5/OpXf+Dmm2/gppt+SlPTVH74w++xcuVydtpJj/afJkcSRRFssgMkUYgJKjpv4ZBX/aV04IEH8Z3vXENXVyf33PM3jjzyAwBccskSHnvsYe6//15eeukFursHv139mWee4rLLgvkhjjjiA7k2hxNPPJmnn36SO+64jTfffJ1MJk0iMfB+urq6ePvtt1m8+FAAdtvt3TQ0NLBy5QoA9tvvPSilmDt3B9raWvu9/6CDDubCC89n0aLFLFq0mH333Z877riNhQsXUVcXVF9/73s/AuDpp5/gK1+5GICtt54Tjjz7ItAzb0VXVxevvPIyV111Re4Y3d3dtLZuZuHCRXz2s5/m4IMPYfHiQ0uaJEASRXHSKayXRrnR8Y5EiAknGo2ycOEiHnnkIf75z3u45prvAnDWWaez117BVKZ7770vl19+cYG9qNzcEkopnLCq+Pvf/w6rV6/i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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curve(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This shows a typical learning curve: for very few training points, there is a large separation between the training and test error, which indicates **over-fitting**.  Given the same model, for a large number of training points, the training and testing errors converge, which indicates potential **under-fitting**.\n",
    "\n",
    "As you add more data points, the training error will never increase, and the testing error will never decrease (why do you think this is?)\n",
    "\n",
    "It is easy to see that, in this plot, if you'd like to reduce the MSE down to the nominal value of 1.0 (which is the magnitude of the scatter we put in when constructing the data), then adding more samples will *never* get you there.  For $d=1$, the two curves have converged and cannot move lower. What about for a larger value of $d$?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEPCAYAAABcA4N7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzsnXmcI1XVv59blaWz9TLdPSswMMDcYV8HgQFBQBAQfFFEfwi+iCAooKjwiuyLiKK44ALK4gLihq++oqgIyA4KCCIgl32G2Zjpmem901mqfn9Ukk66091JT6c7SZ/n88kkdetW1Um65n7rnHvvucp1XQRBEARhNKzpNkAQBEGobkQoBEEQhDERoRAEQRDGRIRCEARBGBMRCkEQBGFMRCgEQRCEMRGhEARBEMZEhEIQBEEYE18lT661vhI4HnCBW4wx3xi2f3fgZqAReAg40xiTqqRNgiAIQnlUzKPQWh8EHALsCuwNnKO11sOq3Q6cbYxZDCjg9ErZIwiCIEyMigmFMeZB4F0ZD2E2nvfSl92vtV4IhIwxT2SKfgx8sFL2CIIgCBOjoqEnY0xSa30FcB7wa2BV3u75wJq87TXAFiWeOggszRyTngRTBUEQZgI2MA94Ehgs9aCKCgWAMeYyrfVXgbvwQks/zOyy8PousijAKfG0S4GHJ81IQRCEmcWBwCOlVq6YUGitlwANxphnjTH9Wuv/xeuvyLIST9myzAVWl3j6NQAb3ngNJ5WcFHsB4g//iOCseaid3jNqHRVtRQVCk3bNyaC1NcqGDb3TbUZZ1JrNtWYviM1TQa3Za1mKlpYIFEZzxqWSHsUi4Aqt9QF4nsP7gFuzO40xy7XWca31MmPMo8DJwJ9KPHcawEklSScnTygc1yK++hUCiw8dtY5KJrB8DZN2zcnCcWovXXyt2Vxr9oLYPBXUmr0ZygrZV7Iz+27gj8AzwNPAY8aYX2it79Za752p9hHgm1rrl4AocH2l7CkFFWsn1bUe1xnjN0zL6F1BEGYWle7Mvhy4fFjZUXmf/wXsU0kbysGKtYGTxu3bhIq1Fa80logIgiDUIRXvzK4lVKwdAKenwxONYjjiUQi1j+u6bNq0nkQiTuGYkull3ToLxyl1TMv0U532KgKBBlpa2lFKTcoZRSjyyIqD27MeWFK0zphhKUGoEXp7u1BKMWfOFihVPZl8fD6LVKraGt7RqUZ7Xdehs7OD3t4uYrHmSTln9dwhVYDyN2CFm3B61o9eSYRCqAMGBnqJxZqrSiSEyUEpi1ishYGByRuNJXfJMPzNs3F7Okav4LriVQg1j+OksW0JKNQrtu3DmcR2SoRiGL7m2Tg963HdMdxJEQqhDpis+LVQfUz231aEYhj+5tmQTuIOdI9eSYRCECaN3t5evvjF88o65qWXXuQrX7lqzDo333wjjzzy4OaYJmQQ33MYvuY5AF74KVy8I8h1UsizmCBMDj093bzyiinrmCVLduSCC3Ycs85pp525OWYJeYhQDMPXNBsAp2c99pztilcSj0IQJo1vfetrdHSs54tfPI/PfvY8zj33LJqamgkGg1x99bVcc81VrF+/jo6O9ey99z5ccMElPPPM09x66w/57nd/yNlnf4Idd9yJf/3rWTo7N3Huueez337LuPrqy9ljj73YY4+9uPDC81i0aFteftkwa1YrV131FRobm7jvvr9yyy030tAQYvFiTTqd5qKLLi+w77vf/RZPPvl3LEtx4IEHc+qpn6C7u4trrrmKFSvexO8PcM45n2WvvZby6KMPc9NNN+C6DvPnL+D88y9k1qxWjj/+GHbccWdeecXw/e/fzBNPPMavf/1zHMdF6yV87nNfwLZtrrnmCl5//TUAjjvugxx77HHT8BcZiQjFMOxQFAKhsUc+yexsoY549N9reOS5slL/lMwBu85j2S7zxqxz7rnnc845Z3DNNV9n3bq1rFixnF//+jvMmzefv/71z2y//WK+9KWvkkwmOemkD2LMSyPOkUym+MEPfsQjjzzETTfdwH77LSvY/+qrr/DFL17K4sVLuOii87nnnj9x6KFHcP3113HzzT+ltbWNiy/+ApFIpOC4tWvX8MQTj3H77b8iHo/z5S9fweDgIDfddCNbbLElX/vaNzDmZa699mq+8pXr+NrXvswNN9zCvHnzueOOn/KNb1zLl770VQD23Xd/rrzyGl5//TXuuut33HDDrQSDQW688bv8/Oe3sdtue9Dd3c2PfnQHHR3rueGG74hQVDNWrH3skU/iUQhCxWhpmcW8efMBePe738OLLz7Pr351B2+++QZdXV0MDPSPOOYd79gPgEWLtqWnZ2T/YkvLLBYvXpKpsx3d3d0899wz7LzzLrS3e1GEI488moce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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curve(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here we see that by adding more model complexity, we've managed to lower the level of convergence to an rms error of 1.0!\n",
    "\n",
    "What if we get even more complex?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curve(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For an even more complex model, we still converge, but the convergence only happens for *large* amounts of training data.\n",
    "\n",
    "So we see the following:\n",
    "\n",
    "- you can **cause the lines to converge** by adding more points or by simplifying the model.\n",
    "- you can **bring the convergence error down** only by increasing the complexity of the model.\n",
    "\n",
    "Thus these curves can give you hints about how you might improve a sub-optimal model. If the curves are already close together, you need more model complexity. If the curves are far apart, you might also improve the model by adding more data.\n",
    "\n",
    "To make this more concrete, imagine some telescope data in which the results are not robust enough.  You must think about whether to spend your valuable telescope time observing *more objects* to get a larger training set, or *more attributes of each object* in order to improve the model.  The answer to this question has real consequences, and can be addressed using these metrics."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span style=\"color:#0b486b\">Tasks</span>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Try the provided examples and get yourself familiar with sample code before attempting portolio tasks.\n",
    "\n",
    "Please show your attempt to your tutor before you leave the lab, or email your files to your coordinator if you are an off-campus student."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span style=\"color:#0b486b\">Summary</span>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We've gone over several useful tools for model validation\n",
    "\n",
    "- The **Training Score** shows how well a model fits the data it was trained on. This is not a good indication of model effectiveness\n",
    "- The **Validation Score** shows how well a model fits hold-out data. The most effective method is some form of cross-validation, where multiple hold-out sets are used.\n",
    "- **Validation Curves** are a plot of validation score and training score as a function of **model complexity**:\n",
    "  + when the two curves are close, it indicates *underfitting*\n",
    "  + when the two curves are separated, it indicates *overfitting*\n",
    "  + the \"sweet spot\" is in the middle\n",
    "- **Learning Curves** are a plot of the validation score and training score as a function of **Number of training samples**\n",
    "  + when the curves are close, it indicates *underfitting*, and adding more data will not generally improve the estimator.\n",
    "  + when the curves are far apart, it indicates *overfitting*, and adding more data may increase the effectiveness of the model.\n",
    "  \n",
    "These tools are powerful means of evaluating your model on your data."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <span style=\"color:#0b486b\">Acknowledgement</span>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Validation and model selection part was put together by [Jake Vanderplas](http://www.vanderplas.com) for PyCon 2015. Source and license info is on [GitHub](https://github.com/jakevdp/sklearn_pycon2015/)."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
